package main

import (
	"fmt"
	"golang.org/x/net/websocket"
	"log"
	"net/http"
)

/*
一个Web客户端只建立一个TCP连接
Websocket服务端可以推送(push)数据到web客户端.
有更加轻量级的头，减少数据传送量

WebSocket URL的起始输入是ws://或是wss://（在SSL上）。下图展示了WebSocket的通信过程
WebSocket的协议颇为简单，在第一次handshake通过以后，连接便建立成功，其后的通讯数据都是以”\x00″开头，以”\xFF”结尾。在客户端，这个是透明的，WebSocket组件会自动将原始数据“掐头去尾”。

go get golang.org/x/net/websocket

客户端JS，很容易的就通过WebSocket函数建立了一个与服务器的连接sock，当握手成功后，会触发WebSocket对象的onopen事件，告诉客户端连接已经成功建立。客户端一共绑定了四个事件。
1）onopen 建立连接后触发
2）onmessage 收到消息后触发
3）onerror 发生错误时触发
4）onclose 关闭连接时触发
*/

func Echo(ws *websocket.Conn) {
	var err error
	for {
		var reply string
		if err = websocket.Message.Receive(ws, &reply); err != nil {
			fmt.Println("Can't receive")
			break
		}
		fmt.Println("Received back from client:", reply)
		msg := "Received: " + reply
		fmt.Println("Sending to client:", msg)
		if err = websocket.Message.Send(ws, msg); err != nil {
			fmt.Println("Can't send")
			break
		}
	}
}

func main() {
	http.Handle("/", websocket.Handler(Echo))
	if err := http.ListenAndServe(":8998", nil); err != nil {
		log.Fatal("ListenAndServe:", err)
	}
}
